extensions/gggl{,-lies}.c: fix a Fixme: (>>8 vs /255)
authorMassimo Valentini <mvalentini@src.gnome.org>
Sat, 14 Jul 2012 15:07:38 +0000 (17:07 +0200)
committerMassimo Valentini <mvalentini@src.gnome.org>
Sat, 14 Jul 2012 15:07:38 +0000 (17:07 +0200)
division per 0x100-1 is implemented using 1 term of (1 + x)^-1
MacLaurin expansion

(1+x)^-1 == 1 + (-1) x

a * (1 - 1/256)^-1 * (256^-1) == (a + a / 256) / 256

with integer division rounded toward the nearest.

extensions/gggl-lies.c
extensions/gggl.c

index 849e3f4e4caea6fb85ef895302b914eca2bf07ae..d56a50ed5f4973a2938545f5d819c4e1c0933eb4 100644 (file)
@@ -1064,9 +1064,10 @@ conv_rgba8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          dst[0] = (src[0] * src[3]) >> 8;      /* FIXME: check if this faster */
-          dst[1] = (src[1] * src[3]) >> 8;      /*        version (>>8 vs /255) */
-          dst[2] = (src[2] * src[3]) >> 8;      /*        is accurate enough   */
+#define div_255(a) ((((a)+127)+(((a)+127)>>8))>>8)
+          dst[0] = div_255 (src[0] * src[3]);
+          dst[1] = div_255 (src[1] * src[3]);
+          dst[2] = div_255 (src[2] * src[3]);
           dst[3] = src[3];
         }
       dst += 4;
index 10094acaaee427a5901ce23b22286c78c2498de9..f1fb8c06c9af8125ebf384021aad044d8ea54f5a 100644 (file)
@@ -1035,9 +1035,10 @@ conv_rgba8_rgbA8 (unsigned char *src, unsigned char *dst, long samples)
         }
       else
         {
-          dst[0] = (src[0] * src[3]) >> 8;      /* FIXME: check if this faster */
-          dst[1] = (src[1] * src[3]) >> 8;      /*        version (>>8 vs /255) */
-          dst[2] = (src[2] * src[3]) >> 8;      /*        is accurate enough   */
+#define div_255(a) ((((a)+127)+(((a)+127)>>8))>>8)
+          dst[0] = div_255 (src[0] * src[3]);
+          dst[1] = div_255 (src[1] * src[3]);
+          dst[2] = div_255 (src[2] * src[3]);
           dst[3] = src[3];
         }
       dst += 4;